#include "terrain.h"
#include <assert.h>
#include "element_niveau.h"

Terrain* creerTerrain(FILE* f)
{
        Terrain* ter;
        ter=new(Terrain);///on alloue la place,
        int i,j,x,y;
        char c;
        fscanf(f,"%d\n%d\n",&x, &y);///on récupère les dimensions du terrain
        terrainSetDimx(ter,x);///et on l'initialise avec
        terrainSetDimy(ter,y);
        for(j=0;j<terrainGetDimY(ter);j++)///après on pose les "caracteristiques" du terrain (le decor quoi)
        {
                                for(i=0;i<terrainGetDimX(ter);i++)
                                {
                                      terrainSetTer(ter,i,j,fgetc(f));
                                }
                                c = fgetc(f);
        }
        return ter;
}

void supprimeTerrain(Terrain* ter)
{
     delete(ter);
}

void afficheTerrain(Terrain* ter)
{
     int x,y;
     cout<<"dimension en x : "<<terrainGetDimX(ter)<<endl<<"dimension en y : "<<terrainGetDimY(ter)<<endl;///on affiche les dimensions
     for(y=0;y<terrainGetDimY(ter);y++)///puis le "decor"
     {
          for(x=0;x<terrainGetDimX(ter);x++)
          {
                                  cout<<terrainGetTer(ter,x,y);
          }
          cout<<endl;
     }
}

int terPosHeroOk(const Terrain* t, const int x, const int y)
{
    assert(x>=0);
    assert(x<38);
    assert(y>=0);
    assert(y<29);
///on test si le hero est bien sur le terrain (et pas en dehors)
    switch(terrainGetTer(t,x,y))
        {
            case '#' : return 0; //mur, ou sol
            break;
            case '.' : return 1; //pas de sol sous les pieds
            break;
            case 'E' : return 2; //echelle
            break;
            case 'D' : return 3; //départ
            break;
            case 'A' : return 4; //arrivée
            break;
			case 'S' : return 6; // passe au terrain suivant
			break;
			case 'P' : return 7; // passe au terrain precedent
			break;
			case 'O' : return 8;
			break;
			case 'C' : return 9;
			break;
            default : return 5;
            break;
        }
}

int terrainGetDimX(const Terrain* t)
{
	return t->dimx;
}

int terrainGetDimY(const Terrain* t)
{
	return t->dimy;
}

char terrainGetTer(const Terrain* t,int x,int y)
{
	return t->ter[x][y];
}

void terrainSetDimx(Terrain* t,int x)
{
     t->dimx=x;
}

void terrainSetDimy(Terrain* t,int y)
{
     t->dimy=y;
}

void terrainSetTer(Terrain* t,int x,int y,char c)
{
     t->ter[x][y]=c;
}

void RechercheDebutTerrain(Terrain* ter,int* x,int* y)
{
    int i;
    int j;
    i=0;
    j=0;
    while(terrainGetTer(ter,i,j)!='D')///on parcours le terrain tant qu'on a pas trouve le point de depart
    {
        if(i+1<terrainGetDimX(ter))
        {
            i++;
        }
        else
        {
            i=0;
            if(j+1<terrainGetDimY(ter))
            {
                j++;
            }
            else
            {
                cout<<"erreur"<<endl;
            }
        }
    }
    *x=i;
    *y=j;
}
